昨天我們聊到 AI 的速度問題:TTFT (首個字元回應時間) 和 TPS (每秒生成字數) 就像餐廳的上菜速度和出餐效率。今天要聊的,是一個讓 AI 「瞬間變快」的魔法技巧。
想像你每天早上都去同一家咖啡廳,點同樣的「大杯熱拿鐵,半糖,加燕麥奶」。
第一種咖啡師:每次都要聽你完整說明,然後重新確認每個細節
「請問要什麼尺寸?」
「要熱的還是冰的?」
「糖度呢?」
「需要換植物奶嗎?」
第二種咖啡師:一看到你就開始準備
「老樣子?」
「好的,馬上來!」
這兩種咖啡師的差別,就是「有沒有記憶」。而在 AI 的世界裡,這種記憶就叫做「Prompt Caching」(提示快取)。
還記得我們在 Day 6-9 談過的 Context Engineering 嗎?我們學會了如何設計完整的上下文,包括系統指令、角色設定、範例、知識庫等等。但這裡有個殘酷的事實:
每次你問 AI 一個新問題,它都要重新「閱讀」一遍所有的上下文。
想像你是一位煉金師,每天早上開工時都要:
即使這些東西昨天就看過了,今天還是要從頭來一遍。這不是很荒謬嗎?
Prompt Caching 就像是給 AI 裝上「短期記憶」,讓它能記住最近處理過的上下文。
傳統方式 (沒有快取):
第一次請求:
系統提示 (5000 tokens) + 知識庫文件 (20000 tokens) + 使用者問題 (50 tokens)
→ AI 需要處理 25050 tokens
第二次請求 (1分鐘後):
系統提示 (5000 tokens) + 知識庫文件 (20000 tokens) + 新問題 (50 tokens)
→ AI 又要重新處理 25050 tokens
使用快取:
第一次請求:
系統提示 (5000 tokens) + 知識庫文件 (20000 tokens) + 使用者問題 (50 tokens)
→ AI 處理 25050 tokens,並快取前 25000 tokens
第二次請求 (1分鐘後):
[從快取讀取 25000 tokens] + 新問題 (50 tokens)
→ AI 只需要處理 50 個新 tokens!
這就像是咖啡師記住了你的「老樣子」,不用每次都重新確認一遍。
等等的文章以 Anthropic 的 Claude 為例,可以參考這篇文章 https://docs.claude.com/en/docs/build-with-claude/prompt-caching
在深入講解之前,讓我們先了解 Claude 快取的具體規格:
足夠應對連續對話 (使用者通常不會等超過 5 分鐘才問下一個問題)
不會佔用過多系統資源 (不像永久快取會消耗大量記憶體)
適合大多數實際應用場景
就像咖啡師的短期記憶,如果你超過 5 分鐘沒回來,他就會忘記你剛才點了什麼。
這設定可以調整,最多調整為一小時
這是很多人忽略的關鍵細節:
Claude 3.5 Sonnet 和 Claude 3 Opus:最小 1024 tokens
Claude 3.5 Haiku:最小 2048 tokens
這意味著如果你的系統提示只有 500 tokens,快取根本不會生效!就像咖啡師不會為了「一杯美式」這麼簡單的訂單特別記住你,因為說一次也很快。
快取寫入 (Cache Write):基礎輸入價格 × 1.25
第一次建立快取時需付的費用
比正常輸入貴 25%
快取讀取 (Cache Hit):基礎輸入價格 × 0.1
從快取讀取時的費用
只要正常輸入的 10%!
快取不是自動啟用的,你需要明確標記:
import anthropic
client = anthropic.Anthropic()
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=1024,
system=[
{
"type": "text",
"text": "你是一位專業的法律顧問,專精於台灣公司法..."
},
{
"type": "text",
"text": "以下是公司法的完整條文內容...",
"cache_control": {"type": "ephemeral"} # 這裡標記要快取
}
],
messages=[
{
"role": "user",
"content": "請問公司登記需要什麼文件?"
}
]
)
關鍵重點:
cache_control: {"type": "ephemeral"} 就是啟用快取的魔法咒語
快取會從這個標記點往前延伸到上一個標記點 (或開頭)
所以要把最不會變動的內容放在快取區塊中
Claude 支援多個快取點,就像煉金師的多層材料櫃:
pythonsystem=[
{
"type": "text",
"text": "系統指令...",
"cache_control": {"type": "ephemeral"} # 快取點 1
},
{
"type": "text",
"text": "產品目錄...",
"cache_control": {"type": "ephemeral"} # 快取點 2
}
]
這個設計的巧妙之處在於:
快取點 1:系統指令幾乎不變 → 快取命中率 99%
快取點 2:產品目錄偶爾更新 → 快取命中率 90%
律師事務所的 AI 助手需要分析大量法律文件
需求:
每份文件 50-100 頁 (約 50000 tokens)
律師會針對同一份文件問 10-20 個問題
需要快速回應,不能讓律師等太久
class LegalDocumentAnalyzer:
def __init__(self):
self.client = anthropic.Anthropic()
def analyze_document(self, document_text):
# 建立帶快取的系統提示
self.system_prompt = [
{
"type": "text",
"text": "你是專業的法律文件分析師,專精於合約審查..."
},
{
"type": "text",
"text": f"待分析文件:\n{document_text}",
"cache_control": {"type": "ephemeral"} # 快取文件內容
}
]
def ask_question(self, question):
response = self.client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=2048,
system=self.system_prompt,
messages=[{"role": "user", "content": question}]
)
return response.content[0].text
# 使用範例
analyzer = LegalDocumentAnalyzer()
analyzer.analyze_document(long_legal_document)
# 第一個問題 (建立快取)
answer1 = analyzer.ask_question("這份合約的有效期限是?") # 約 8 秒
# 後續問題 (使用快取)
answer2 = analyzer.ask_question("違約條款是什麼?") # 約 1.5 秒
answer3 = analyzer.ask_question("有哪些特殊條件?") # 約 1.5 秒
實際效益:
速度:第一個問題 8 秒,後續問題 1.5 秒 (提升 5.3 倍)
成本:每份文件 20 個問題,成本從 $0.60 降到 $0.15 (節省 75%)
體驗:律師不用每次都等 8 秒,工作效率大幅提升
如果是以下幾種服務會比較建議啟用快取功能:
多輪對話系統:系統指令固定,使用者會連續提問
文件分析工具:待分析文件不變,使用者會問多個問題
客服機器人:產品知識庫固定,高頻率使用
現在,你不只知道如何讓 AI 給出正確答案,更知道如何讓它快速回應。Prompt Caching 不只是一個技術優化,而是思維的轉變:從「讓 AI 做對」到「讓 AI 做得又快又好」
最好的魔法,是讓人感覺不到魔法的存在。當使用者覺得「這個 AI 好快、好聰明」時,他們看不到背後精心設計的快取策略、優化的提示結構、完善的記憶管理。但這正是我們的價值所在——用科學與藝術,打造出看似神奇實則精密的系統。